package com.cskaoyan.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.*;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

//把当前类作为配置类，同时也是容器中的组件：使用注入功能的注解
@Configuration
@ComponentScan("com.cskaoyan")
@PropertySource("classpath:param.properties")
@EnableAspectJAutoProxy
@EnableTransactionManagement
public class SpringConfiguration {

    /**
     * 返回值：作为容器中的组件，定义的时候可以写实现类也可以写接口
     * 方法名：方法名作为默认的组件id
     * 方法体：按照SE的代码风格返回一个实例，作为容器中的组件
     * @Bean的value属性：指定组件id
     * @return
     */
    //@Bean("ds")//组件id：ds
    @Bean        //组件id：dataSource
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/cskaoyan_db");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        return dataSource;
    }

    /**
     * 形参：从容器中按照类型取出组件（容器中该类型的组件只有一个）
     * 如果容器中该类型的组件不止一个呢？就需要指定组件id 👉 @Qualifier
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(@Qualifier("dataSource") DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }

    @Bean
    public DataSourceTransactionManager transactionManager(DataSource dataSource) {
        //也可以使用无参构造方法和set方法
        return new DataSourceTransactionManager(dataSource);
    }
}
